﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;

namespace Biosek
{
	/// <summary>
	/// Modelo para el reconocimiento de patrones.
	/// </summary>
	public interface IPatternMatchingModel
	{
		/// <summary>
		/// Evalua el modelo en una muestra e indica su aceptacion o rechazo
		/// </summary>
		/// <param name="sample">Muestras a ser evaluadas</param>
		/// <returns>Un valor booleano por cada muestra procesada</returns>
		IEnumerable<bool> EvaluateMatchBinary(IEnumerable samples);

		/// <summary>
		/// Evalua el modelo en una secuencia de muestras e indica el grado de afinidad con el modelo
		/// </summary>
		/// <param name="samples">Muestras a ser evaluadas</param>
		/// <returns>Un valor real por cada muestra procesada</returns>
		IEnumerable<float> EvaluateMatch(IEnumerable samples);
				
		/// <summary>
		/// Indica los tipo se muestra aceptados.
		/// </summary>
		IEnumerable<Type> AcceptedSampleTypes { get; }
		
		/// <summary>
		/// Indica si el modelo esta habilitado para ser evaluado usando EvaluateMatchBinary().
		/// En caso de ser falso, el modelo esta habilitado para ser evaluado usando EvaluateMatch().
		/// </summary>
		bool IsBinaryResponse { get; }
	}

	/// <summary>
	/// Cargador de modelo, le permite obtener un modelo a partir de un flujo de datos
	/// </summary>
	public interface IPatternMatchingModelLoader
	{
		/// <summary>
		/// Cargar modelo desde flujo de datos
		/// </summary>
		/// <param name="stream">Flujo de informacion desde el cual se carga el modelo</param>
		/// <returns>Modelo cargado</returns>
		IPatternMatchingModel LoadModel(Stream stream);		
	}
}
